#ifndef INQUIRY_H
#define INQUIRY_H
/*!
 * \file inquiry.h
 * \brief Logiciel de test par detection video
 * \version 1.0
 */
#include <QThread>
#include <QDebug>
#include <QMutex>
#include <QSize>
#include <QTimer>
#include <QDateTime>
#include <QDir>
#include <imageconsumer.h>
/**
 * \brief Inspecteur d'images.
 * \version 1.0
 * Classe de detection sur les images captees.
 */
class Inquiry : public QThread, public ImageConsumer
//
{
    Q_OBJECT
private:
    QTimer *timer;
    IplImage *cvimage0;
    IplImage *cvimage1;
    QString nameDir;

    bool inRefresh;

    double psnrMin;
    double ssimMin;
    bool usePsnr;
    bool useSsim;

    double psnr;
    QString str;

    /*!
     *  \fn double getPSNR()
     *  \brief Calcul du PSNR
     *  Fonction de calcul du PSNR avec cvimage0 et cvimage1
     *  \return double, PSNR entre cvimage0 et cvimage1
     */
    double getPSNR() const;
    /*!
     *  \fn CvScalar getSSIM()
     *  \brief Calcul du SSIM
     *  Fonction de calcul du SSIM avec cvimage0 et cvimage1
     * \return double, SSIM entre cvimage0 et cvimage1
     */
    CvScalar getSSIM() const;
    /*!
     *  \fn bool changedImage()
     *  \brief Detection de nouvelle image
     *  Fonction qui indique si cvimage0 et cvimage1 sont relativement différentes
     *  \return true si cvimage0 relativement différent de cvimage1
     *  false sinon
     */
    bool changedImage() const;
    /*!
     *  \fn bool saveImage()
     *  \brief Sauvegarde de cvimage1
     *  Fonction qui sauvegarde cvimage1 dans un fichier image.
     */
    bool saveImage() const;
public:
    /*!
     *  \fn Inquiry(QString nameTest="")
     *  \brief Constructeur
     *  Constructeur de la classe Inquiry
     *  \param nameTest : nom du test effectif
     */
    Inquiry(QString nameTest="");
    /*!
     *  \fn ~Inquiry()
     *  \brief Destructeur
     *  Destructeur de la classe Inquiry
     */
    ~Inquiry();
    /*!
     *  \fn void run()
     *  \brief Lancement du thread
     *  Methode qui lance le thread de traitement d'images.
     */
    void run();
    /**
      * \fn void setNameTest(QString nameTest)
      * \brief Definit le nom du test
      * Permet de donner le nom du test au dossier contenant les images, n'a d'effet qu'avant l'execution du run()
      * \param nameTest : nom du test
      */
    void setNameTest(QString const nameTest);

signals:
    /**
      * \fn void stopSignal()
      * \brief signal de fermeture
      * Signal envoyer pour stopper le timer lance par run()
      */
    void stopSignal();

public slots:
    /*!
     *  \fn void terminate()
     *  \brief Arret du thread
     *  Surcharge de terminate pour arreter le thread proprement
     */
    void terminate();

private slots:
    /*!
     *  \fn void refresh()
     *  \brief Fonction de rafraichissement
     *  Fonction executer reguliemrent pour tester les images filmees.
     */
    void refresh();
};
#endif // INQUIRY_H
